<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <title>IO流  &middot; sitename</title>
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1">


<meta name="description" content="IO流 description" />

<meta name="keywords" content="three, four, ">


<meta property="og:title" content="IO流  &middot; sitename ">
<meta property="og:site_name" content="sitename"/>
<meta property="og:url" content="https://lvzongcheng.gitee.io/java/io%E6%B5%81/" />
<meta property="og:locale" content="en-EN">


<meta property="og:type" content="article" />
<meta property="og:description" content="IO流 description"/>
<meta property="og:article:published_time" content="2017-05-13T00:00:00Z" />
<meta property="og:article:modified_time" content="2017-05-13T00:00:00Z" />

  
    
<meta property="og:article:tag" content="three">
    
<meta property="og:article:tag" content="four">
    
  

  

<script type="application/ld+json">
  {
    "@context": "http://schema.org",
    "@type": "Article",
    "headline": "IO流",
    "author": {
      "@type": "Person",
      "name": "LvZongCheng"
    },
    "datePublished": "2017-05-13",
    "description": "IO流 description",
    "wordCount":  414 
  }
</script>



<link rel="canonical" href="https://lvzongcheng.gitee.io/java/io%E6%B5%81/" />

<link rel="apple-touch-icon-precomposed" sizes="144x144" href="https://lvzongcheng.gitee.io/touch-icon-144-precomposed.png">
<link href="https://lvzongcheng.gitee.io/favicon.png" rel="icon">

<meta name="generator" content="Hugo 0.60.0" />

  <!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->

<link href='https://fonts.googleapis.com/css?family=Merriweather:300%7CRaleway%7COpen+Sans' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="/css/font-awesome.min.css">
<link rel="stylesheet" href="/css/style.css">
<link rel="stylesheet" href="/css/highlight/default.css">

  
  
	<script>
	  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
	  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
	  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
	  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

	  ga('create', 'Your Google Analytics tracking code', 'auto');
	  ga('send', 'pageview');

	</script>

</head>
<body>
  <main id="main-wrapper" class="container main_wrapper has-sidebar">
    <header id="main-header" class="container main_header">
  <div class="container brand">
  <div class="container title h1-like">
  <a class="baselink" href="https://lvzongcheng.gitee.io">
  LvZongCheng

</a>

</div>

  
<div class="container topline">
  
  淡定 执著 进取 自律


</div>


</div>

  <nav class="container nav primary no-print">
  

<a class="homelink" href="https://lvzongcheng.gitee.io">home</a>


  
<a href="https://lvzongcheng.gitee.io/framework" title="Show list of Frameworks">Frameworks</a>

<a href="https://lvzongcheng.gitee.io/java" title="Show list of Java">Java</a>

<a href="https://lvzongcheng.gitee.io/linux" title="Show list of Linux">Linux</a>

<a href="https://lvzongcheng.gitee.io/redis" title="Show list of Redis">Redis</a>

<a href="https://lvzongcheng.gitee.io/sql" title="Show list of SQL">SQL</a>

<a href="https://lvzongcheng.gitee.io/Spring" title="Show list of Spring">Spring</a>

<a href="https://lvzongcheng.gitee.io/tools" title="Show list of Tools">Tools</a>

<a href="https://lvzongcheng.gitee.io/webpage" title="Show list of WebPage">WebPage</a>

<a href="https://lvzongcheng.gitee.io/information" title="Show list of information">information</a>

<a href="https://lvzongcheng.gitee.io/network" title="Show list of network">network</a>

<a href="https://lvzongcheng.gitee.io/%E5%BE%AE%E6%9C%8D%E5%8A%A1" title="Show list of 微服务">微服务</a>

<a href="https://lvzongcheng.gitee.io/%E6%80%BB%E7%BB%93" title="Show list of 总结">总结</a>

<a href="https://lvzongcheng.gitee.io/%E6%9C%BA%E5%99%A8%E8%87%AA%E5%8A%A8%E5%8C%96" title="Show list of 机器自动化">机器自动化</a>

<a href="https://lvzongcheng.gitee.io/%E6%B1%87%E7%BC%96" title="Show list of 汇编">汇编</a>

<a href="https://lvzongcheng.gitee.io/%E8%AE%B0%E4%BA%8B%E6%9C%AC" title="Show list of 记事本">记事本</a>


</nav>

<div class="container nav secondary no-print">
  
<a id="contact-link-email" class="contact_link" rel="me" aria-label="Email" href="mailto:Lyc19880405@163.com">
  <span class="fa fa-envelope-square"></span></a>



<a id="contact-link-github" class="contact_link" rel="me" aria-label="Github" href="https://github.com/enten/hugo-boilerplate">
  <span class="fa fa-github-square"></span></a>




 


















</div>


  

</header>


<article id="main-content" class="container main_content single">
  <header class="container hat">
  <h1>IO流
</h1>

</header>

  <div class="container content">
  <h2 id="io">IO流</h2>
<hr>
<p>IO流用来处理设备之间的数据传输
(1).流按操作数据分为两种：字节流与字符流。
(2).流按流向分为：输入流，输出流。</p>
<p>IO流常用基类
字节流的抽象基类：
InputStream,OutputStream.
字符流的抽象基类：
Reader,Writer
由这四类派生的子类都是以父类名作为子类后缀名。</p>
<hr>
<h3 id="heading">一、向文件写入数据</h3>
<p>用FileWriter对象创建文件，在初始化时要明确被操作的文件。
而且该文件会被创建到指定目录下，如果该目录下已有同名文件，
将被覆盖。该步其实就是明确文件的存放地址。
例：FileWriter fw=new FileWriter(文件路径或文件名);
fw.write(&ldquo;adfaa&rdquo;);//调用write方法，将字符串写入到流中(即写到缓存中)。
fw.flush();//将缓存中的数据刷到目的地中
fw.close();//关闭流，在关闭之前会刷新缓冲数据</p>
<pre><code>flush()与close()的区别是：
flush()刷新数据后缓存中的数据流还在，还可以继续使用。
close()刷新数据后缓存中的数据流已被关闭，不能继续使用。
</code></pre>
<p>对流要进行异常捕获
会出现异常有：文件未创建成果而进行关闭流操作。超出文件大小。
linux系统和windows系统的文件路径表示不一样。</p>
<p>对已有数据文件续写（帮助文档详）
public FileWriter(File file,boolean append)throws IOException
根据给定的 File 对象构造一个 FileWriter 对象。如果第二个参数为 true，则将字节写入文件末尾处，而不是写入文件开始处。</p>
<hr>
<h3 id="heading1">二、读取文本文件数据</h3>
<p>(1).创建一个文件读取流对象，和指定名称的文件相关联。
(2).要保证该文件是已经存在的，如果不存在会发生异常FileNotFoundException
例：FileReader fr=new FirleReader(文件路径或文件名);
fr.read();//一次读一个，会自动往下读。可以一次读入多个后在一次性存入（read其他用法详见帮助文档）</p>
<pre><code>fr.close();//关闭流
</code></pre>
<hr>
<hr>
<h3 id="heading2">一、读写流</h3>
<h5 id="1">1.字符流的缓冲区：</h5>
<p>(1)提高对数据的读写效率。
(2)对应的类有
BufferedWriter
BufferedReader
(3)缓冲区要结合流才可以使用。
(4)在流的基础上对流的功能进行了整强。</p>
<h5 id="2">2.创建缓冲区步骤：</h5>
<p>(1)缓冲区的出现是为了提高流的操作效率而出现的。
所以在创建缓冲区之前，必须要先有流对象。
(2)只要将需要被提高效率的流对象做为参数传递给缓冲区的构造函数即可。
(3)只要用到缓冲区，就要刷新。
(4)关闭缓冲区，就是在关闭缓冲区中的流对象。
例一：字符写入流缓冲区
FileWriter fw=new FileWriter(&ldquo;文件名&rdquo;);
BufferedWriter bw=new BufferedWriter(fw);
bw.write(&ldquo;abcde&rdquo;);
bw.flush();
例二：字符读取流缓冲区
FileReader fr=new FileReader(&ldquo;文件名&rdquo;);
BufferedReader br=new BufferedReader(fr);
br.readLine();//每次读一行。（其他reade用法帮助文档详）
br.close();</p>
<p>newLine() 是缓冲区提供的跨平台换行符。（用于windows或linux系统等）
readLine方法返回的时候只返回字符之前的数据内容。并不返回回车符。</p>
<hr>
<h3 id="heading3">二、装饰设计模式</h3>
<ol>
<li>就是基于已有功能进行功能整强（像放大镜）。
例：read 每次只能读取一个字符，提供一个基于read的readLine类，
扩充功能，让readLine每次读一行。</li>
<li>可以自定义类，将已有对象传人，基于已有的功能，并提供加强功能。
那么自定义的该类称为装饰类。</li>
<li>装饰设计模式与继承的区别
|——装饰模式比继承灵活，避免了继承的臃肿。降低了类与类之间的
关系。
|——装饰类因为增强已有对象，具备的功能和已有的是相同的，只不
过提供了更强功能。所以装饰类和被装饰同常都属于一个体系中的。</li>
</ol>
<hr>
<h3 id="heading4">三、字节流</h3>
<p>字节流不需要刷新，字节流处理图片、声音和视频等。
字符流的底层也是字节流。</p>
<h6 id="heading5">字节流的缓冲。</h6>
<p>BufferedInputStream和BufferedOutputStream
例：
BufferedInputStream bufis=new BufferedInputStream(new FileInputStream(&ldquo;c:\0.mp3&rdquo;));</p>
<p>例：自己编写字节缓冲流
注意：在字节流中，当字节流返回-1时，返回值类型是int型，类型会自动提升
。与结束标记会相同，导致程序结束而无法复制。为了避免这种情况发生</p>
<p>例：<br>
在字节流中正数取反加一为负数。 
byte型的-1<br>
（11111111)<br>
类型自动提升为<br>
int型的 -1<br>
（11111111 11111111 11111111 11111111)为了自动提升后与-1保持区别<br>
进行与运算。让其他位补零不补一，让结果为（00000000 00000000 00000000 11111111）</p>
<pre><code> 11111111 11111111 11111111 11111111
&amp;
 00000000 00000000 00000000 11111111
----------------------------------------
 00000000 00000000 00000000 11111111
</code></pre>
<p>所有下面 return b&amp;255;或return b&amp;Oxff;都一样，换算的进制不一样。</p>
<p>代码如下：
import java.io.<em>;
class MyBufferedInputStream
{
private InputStream in;
private byte[] buf=new byte[1024</em>4];
private int pos =0,count=0;
MyBufferedInputStream(inputStream in)throws IOException
{
this.in=in;
}
public int myRead()
{
if(count==0)
{
count=in.read(buf);
if(count&lt;0)
{
return -1;
}
pos=0;
byte b=buf[pos];
count&ndash;;
pos++;
return b&amp;255;
}else if(count&gt;0)
{
byte b=buf[pos];
count&ndash;;
pos++;
return b&amp;Oxff;
}
return -1;
}
public void myClose()throws IOException
{
in.close();
}
}</p>
<hr>
<h3 id="heading6">四、读取转换流</h3>
<p>将字节流对象转换成字符流对象，使用转换流。InputStreamReader
将字符流对象转换成子节流对象，使用转换流。OutputStreamWrite</p>
<p><strong>注意</strong>：只有转换流可以指定编码表（即字符集）</p>
<h6 id="11">1.键盘录入最常见写法：</h6>
<p>(1)分歩写法如下：</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>(2)整合写法如下：</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h6 id="21">2.键盘输出最常见写法：</h6>
<p>(1)分歩写法法如下：</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>(2)整合写法如下：</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>字符输出需要刷新</p>
<p>只要改变输入输出流的源就可以改变他的输入输出的位置。</p>
<p>3.流操作的基本规律：</p>
<h6 id="heading7">通过三个来明确完成:</h6>
<p>(1)明确源和目的。
|——源：输入流：InputStream Reader
|——目的：输出流：OutputStream Writer
(2)操作的数据是否是纯文本。
|——是：字符流。
|——不是：字节流。
(3)当明确体系后，再明确要使用哪个具体的对象。
|——通过设备来区分：
||——源设备：内存、硬盘、键盘
||——目的设备：内存、硬盘、控制台</p>
<p>4.改变标准输入输出设备</p>
<p>//另一种不常用输入输出，（用法帮助文档详）
例：</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>在集合中的Properties可以保存在流中或从流中加载。</p>
<p>例：</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<hr>
<hr>
<h3 id="heading8"></h3>
<p>File类是用来操作文件和目录不能访问文件内容</p>
<pre><code>File用来将已有的和未出现的文件或者文件夹封装成对象
File.separator 是为了让分隔符跨平台。
File的常见方法：
</code></pre>
<h6 id="12">1.创建</h6>
<p>boolean createNewFile();<br>
在指定位置创建文件，如果该文件已经存在，则不创建，返回false.<br>
和输出流不一样，输出流对象一建立创建文件。而且文件已经存在，会覆盖。<br>
检查文件是否存在，若不存在则创建该文件</p>
<p>boolean mkdir():创建文件夹。<br>
boolean mkdirs():创建多级文件夹。</p>
<h6 id="22">2.删除</h6>
<p>boolean delete():删除失败返回false.<br>
void deletOnExit()：在程序退出时删除指定文件。<br>
注：<br>
删除一个带内容的目录。<br>
删除原理：<br>
在windows中，删除目录从里面往外删除。</p>
<h6 id="3">3.判断</h6>
<p>boolean exists():文件是否存在。</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>4.获取信息</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>注：
在判断文件对象是否是文件或者目录时，必须先判断该文件对象封装的内容是否
存在。通过exists判断。</p>
<hr>
<h6 id="01">&lt;01&gt;</h6>
<p>static 静态是不能被序列化。
transient关键字是让非静态不被序列化。</p>
<p>ObjectlnputStream 与ObjectOutputStream成对出现
ObjectlnputStream读取的只能用ObjectOutputStream输出</p>
<hr>
<h6 id="02">&lt;02&gt;</h6>
<p>RandomAccessFile:
随机访问文件，自身具备读写的方法。</p>
<p>管道流：
PibedlnputStream和PipedOutputStream
输入输出可以直接进行连接，通过结合线程使用。</p>
<hr>
<h6 id="03">&lt;03&gt;</h6>
<p>RandomAccessFile
该类不算是IO体系中子类。
而是直接继承自Object.
但是它是IO包中成员。因为它具备读和写功能。
内部封装了一个数组，而且通过指针对数组的元素进行操作。
可以通过getFilePointer获取指针位置，
同时可以通过seek改变指针的位置。</p>
<p>该类只能操作文件。还带有模式：只读r， 读写rw等。
如果模式为只读r，不会创建文件，会去读取一个已存在的文件，
如果不存在，则会出现异常。
如果模式为rw。操作文件不存在，会自动创建。如果存在则不会覆盖。</p>
<hr>
<h6 id="04-io">&lt;04 IO包中的其他类&gt;</h6>
<p>操作基本数据类型
DatalnputStream与DataOutputStream
操作字节数组
ByteArrayInputStream与ByteArrayOutputStream
操作字符数组
CharArrayReader与CharArrayWrite
操作字符串
StringRedader与StringWriter</p>
<hr>
<h6 id="05">&lt;05&gt;</h6>
<p>用于操作字节数组的流对象。
ByteArrayInputStream:在构造的时候，需要接受数据源，而且数据源是有个字节
数组。
ByteArrayOutputStream:在构造的时候，不用定义数据目的，因为该对象中已经
内部封装了可变长度的字节数组。
这就是数据目的地。
因为这两个流对象都操作的数组，并没有使用系统资源。所以，不用进行close
关闭</p>
<p>源设备：
键盘 System.in, 硬盘 FileStream 内存 ArrayStream
目的设备：
控制台 System.out 硬盘FileStream 内存 ArrayStream.</p>
<hr>
<h6 id="06-">&lt;06 字符编码&gt;</h6>
<p>这两个假入了编码流对象
InputStreamReader
OutputSteamWriter
编码：字节串变成字节数组。
解码：字节数组变成字符串。
Strng&ndash;&gt;byte[]:str.getBytes();
byte[]&ndash;&gt;String:new String(byte[]);</p>
<hr>
<h6 id="111">&lt;11&gt;</h6>
<p>Properties是hashtable的子类，是集合中和IO技术相结合的集合容器。
该对象的特点：可以用于键值对形式的配置文件。</p>
<hr>
<h6 id="14">&lt;14&gt;</h6>
<p>listFiles()
返回：
抽象路径名数组，这些路径名表示此抽象路径名表示的目录中的文件和目录。
如果目录为空，那么数组也将为空。如果抽象路径名不表示一个目录，或者
发生 I/O 错误，则返回 null</p>
<p>isDirectory(); 
当且仅当此抽象路径名表示的文件存在且 是一个目录时，
返回 true；否则返回 false</p>
<p>Properties是hashtable的子类
也就是说它具备map集合的特点。而且它里面存储的键值对都是字符串。
是集合中和IO技术结合的集合容器。
该对象的特点：可以用于键值对形式的配置文件。
那么在加载数据时，需要数据有固定格式：键=值</p>
<hr>
<h6 id="15">&lt;15&gt;</h6>
<p>打印流：
该流提供了打印方法，可以将各种数据类型的数据都原样打印。</p>
<p>字节打印流：
PrintStream
构造函数可以接收的参数类型：
1.file对象。File
2.字符串路径。String
3.字节输出流。OutputStream</p>
<h2 id="4writer">字符打印流：
PrintWriter
构造函数可以接收的参数类型：
1.file对象。File
2.字符串路径。String
3.字节输出流。OutputStream
4.字符输出流。Writer</h2>
<h6 id="io1">IO流合并流</h6>
<h2 id="serializable">打印流：
PrintWriter与PrintStream
可以直接操作输入流和文件。
序列流：
SequencelnputStream
对多个流进行合并。
操作对象
ObjectlnputStream 与ObjectOutputStream
被操作的对象需要实现Serializable(标记接口)</h2>
<h6 id="heading9">切割文件</h6>
<p>读取一部分字节流存入一个文件
在读取另外一部分存入另外一个文件</p>
<hr>
<h3 id="pathpathsfiles-17">Path、Paths、Files （1.7新特性）</h3>
<p>Path 平台无关的路径接口<br>
Path用法:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h6 id="files-">Files 操作文件的工具类</h6>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h6 id="filevisitor-">FileVisitor 遍历文件和目录</h6>
<p><strong>CONTINUE</strong> ：代表&quot;继续访问&quot;的后续行为。
<strong>SKIP_SIBLINGS</strong>：代表&quot;继续访问&quot;的后续行为，但不访问该文件或目录的兄弟文件或目录。
<strong>SKIP_SUBTREE</strong>：代表&quot;继续访问&quot;的后续行为，但不访问该文件或目录的子目录树。
<strong>TERMINATE</strong>：代表&quot;中止访问&quot;的后续行为。</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h6 id="watchservice">WatchService监控文件变化</h6>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h6 id="heading10">访问文件属性</h6>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<hr>
<h2 id="io-">新IO 概述</h2>
<p>新IO采用内存映射文件的方式来处理输入/输出，新IO将文件或文件的一段区域映射到内存中
这样就可以像访问内存一样来访问文件了。
java.nio
Channel(通道)和Buffer(缓冲)是新IO核心对象</p>
<hr>
<h2 id="heading11">序列化</h2>
<ul>
<li>实现的是Serializable接口，则所有的序列化将会自动进行；</li>
<li>若实现的是Externalizable接口，则没有任何东西可以自动序列化，需要在writeExternal方法中进行手工指定所要序列化的变量，这与是否被transient修饰无关。</li>
</ul>
<h6 id="transient">transient使用小结</h6>
<ol>
<li>一旦变量被transient修饰，变量将不再是对象持久化的一部分，该变量内容在序列化后无法获得访问。</li>
<li>transient关键字只能修饰变量，而不能修饰方法和类。注意，本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量，则该类需要实现Serializable接口。</li>
<li>被transient关键字修饰的变量不再能被序列化，一个静态变量不管是否被transient修饰，均不能被序列化。</li>
</ol>

</div>


  
</article>
      <footer id="main-footer" class="container main_footer">
  

  <div class="container nav foot no-print">
  
<a href="https://lvzongcheng.gitee.io/license">license</a>


  <a class="toplink" href="#">back to top</a>

</div>

  <div class="container credits">
  
<div class="container footline">
  
  code with <!-- raw HTML omitted --><!-- raw HTML omitted -->


</div>


  
<div class="container copyright">
  
  (c) 2015 yourname.


</div>


</div>

</footer>

    </main>
    
<script type="text/javascript">
  (function() {
    
    
    if (window.location.hostname == "localhost")
      return;
    var dsq = document.createElement('script'); dsq.async = true; dsq.type = 'text/javascript';
    dsq.src = '//your_disqus_shortname.disqus.com/count.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
  })();
</script>



<script src="/js/highlight.pack.js"></script>
<script>hljs.initHighlightingOnLoad();</script>



    
  </body>
</html>

